package pool;

import objectpack.Student;
import util.MathUtil;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 *
 * 乱序的问题和任务执行中断的问题
 *
 * 验证线程池的任务的顺序执行
 * 结论是无法按照提交顺序执行任务，除非一个
 *
 * 输出顺序不能代表线程是否被
 *
 * 并发时，是每个线程可能被交替执行，但是线程的任务不会被cpu夺走分配给其他线程，线程会被cpu中断，但不会被夺走任务
 *
 *
 */
public class TaskOrder {


    public static void main(String[] args) {

        // Executors.;

        Integer m = 1000;
        Student student = new Student("张三", 1000, "男");
        ExecutorService executor = Executors.newFixedThreadPool(10);

        // 验证任务的无序性
        // for (int i = 0; i < 1000; i++) {
        //     int finalI = i;
        //     // 提交后会自动执行
        //     MathUtil.resolvePrime();
        //     executor.submit(() -> System.out.println(finalI));
        // }

        for (int i = 0; i < 1000; i++) {

            int finalI = i;
            executor.submit(() -> {
                System.out.println("start t " + Thread.currentThread().getName());
                System.out.println(finalI + " : " + student.getAge());
                student.setAge(student.getAge() - 1);
                System.out.println("end   t " + Thread.currentThread().getName());
            });

            // 提交间隔短的话，一个任务可能会被中断，然后由一个新线程来执行
            MathUtil.resolveSmallPrime();

            // 任务提交间隔长，会按照提交顺序执行，一个任务不会被中断
            // MathUtil.resolvePrime();

        }

        MathUtil.resolvePrime10();
        executor.shutdown();

        System.out.println(student);

    }

}
